package com.eddie.template.improve;

/**
 * @author Eddie
 * @date 2022/08/03 11:20
 **/
public abstract class SoYaMilk {
    private Integer count;

    /**
     * 模板方法,模板方法可以作为final，不让子类去覆盖
     */
    final void make() {
        for (count = 1; count <= 4; ) {
            switch (count) {
                case 1 -> {
                    select();
                }
                case 2 -> {
                    if (customerWantCondiments()) {
                        addCondiments();
                    }
                }
                case 3 -> {
                    soak();
                }
                case 4 -> {
                    beat();
                }
            }
            count++;
        }

    }

    //选材料
    void select() {
        System.out.println("第"+count+"步：选择好的新鲜黄豆");
    }

    //添加不同的材料，抽象方法，子类具体实现
    abstract void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第"+count+"步：黄豆和配料开始浸泡，需要3小时");
    }

    void beat() {
        System.out.println("第"+count+"步：黄豆和配料放入豆浆机去打碎");
    }

    /**
     * 钩子方法,绝地是否需要添加配料
     */
    boolean customerWantCondiments() {
        return true;
    }
}
